﻿float4x4 World;//ma trận world
float4x4 View;// ma trận view
float4x4 Projection;// ma trận projection

// TODO: add effect parameters here.
bool TextureEnabled=false;
float3 DiffuseColor = float3(1, 1, 1);//màu khuếch tán
float3 AmbientColor = float3(0.1, 0.1, 0.1);//màu môi trường
float3 LightDirection= float3(1,1,1);//huong anh sang
float3 LightColor= float3(0.9,0.9,0.9);//mau anh sang
float SpecularPower=32;//độ phản chiếu
float3 SpecularColor= float3(1,1,1);//màu phản chiếu
float3 CameraPosition;//vị trí camera


texture BasicTexture;
sampler BasicTextureSampler= sampler_state{
texture=<BasicTexture>;
	MinFilter= Anisotropic;
	MagFilter= Anisotropic;
	MipFilter= Linear;
	AddressU= Wrap;
	AddressV= Wrap;

};

//định nghĩa

struct VertexShaderInput
{
    float4 Position : POSITION0;//vi tri các vertex trước khi được biến đổi trong các ma trận
	float2 UV:TEXCOORD0;//he truc toa do texture UV co gia tri trong khoang (0,0)(tren+trai)->(1,1)(duoi+phai)
	float3 Normal:NORMAL0;
   
};

struct VertexShaderOutput
{
    float4 Position : POSITION0;//vị trí các vertex sau khi được biến đổi trong các ma trận
	float2 UV:TEXCOORD0;
	float3 Normal: TEXCOORD1;
	float3 ViewDirection:TEXCOORD2;

};

///////////////////////////////////////////////////////////////////////////////////////////



//Đó là 1 thể hiện mới của cấu trúc VertexShaderOutput:
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
    VertexShaderOutput output;
    float4 worldPosition = mul(input.Position, World);//vị trí vật
    float4 viewPosition = mul(worldPosition, View);//vị trí camera
    output.Position = mul(viewPosition, Projection);//vị trí các vertex sau khi đc biến đổi trong các ma trận
	output.UV= input.UV;
	output.Normal= mul(input.Normal,World);
	output.ViewDirection= worldPosition- CameraPosition;//vector nhìn
    return output;
}
//Nhan VectorSharederOutput nhu la input,trả về màu của từng pixcel
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
//Không hiểu:normalize,saturate,dot,reflect
//dot:a = [a1, a2, ..., an] and b = [b1, b2, ..., bn] || dot: a1.b1+a2.b2+...
//saturate: Clamps the specified value within the range of 0 to 1.
//tex2D: trả về giá trị màu lấy từ texture sampler
//reflect:Trả về một vector phản xạ bằng cách sử dụng một tia tới và một bề mặt bình thường .
//normalize:đưa độ dài về 1 tránh bị kéo dãn bởi ma trần world
	//output là màu khuếch tán + màu môi trường
	float3 color= DiffuseColor;

  //texture is necessary
  
	if(TextureEnabled)
		color*=tex2D(BasicTextureSampler,input.UV);

    //màu môi trường
	float3 finallight= AmbientColor;// 1

    //hướng ánh sáng
	float3 lightDir= normalize(LightDirection);//
    //??
	float3 normal= normalize(input.Normal);//vector pháp tuyến

  //tính toán đơn vị sáng
	finallight+=saturate(dot(lightDir,normal))*LightColor;//lam bão hòa lại với nhau 2
	//
    float3 refl= reflect(lightDir,normal);//phản chiếu lại
    //??
	float3 view= normalize(input.ViewDirection);// View hướng
  //ánh sáng phản chiếu
	finallight+=pow(saturate(dot(refl,view)),SpecularPower)*SpecularColor;//3
  //calculator final color
  
	float3 output= saturate(finallight)*color;
	
    return float4(output,1);
}

technique Technique1
{
    pass Pass1
    {
        // TODO: set renderstates here.

        VertexShader = compile vs_2_0 VertexShaderFunction();
        PixelShader = compile ps_2_0 PixelShaderFunction();
    }
}
